//
//import (Common) in "common";
//
//map *skills      =([]);
//map *bufs        =([]);
//map *skillRefBuf =([]);
//
////
////map BUF_T=({
////    "WU_GONG":0,
////    "FA_GONG":1,
////    "XUAN_YUN":2,
////    "BING_DONG":3
////});
////
//////输出参考
////map RESULT_REFER_T=({
////    "GONG_JI":0,
////    "FANG_YU":1,
////    "XUE_LIANG":2,
////    "NENG_LIANG":3
////});
////
////
////map RESULT_REFER_T=({
////    "GONG_JI":0,
////    "FANG_YU":1,
////    "XUE_LIANG":2,
////    "NENG_LIANG":3
////});
////
////
////
////
////map bufferDict = ([
////    ({
////        //buf编号
////        "bid":"1000000001",
////        "bufType":this.BUF_T["WU_GONG"],
////        "triggerOdds":100,
////        "resultType":1,//直接输出
////        //输出参考
////        "refTarget":this.RESULT_REFER_T["GONG_JI"],
////        //变化要求 1 增加 2 减少 3反弹
////        "changeType":1,
////        //变化类型 1百分比 2直接量
////        "changeValType":2,
////        //变量量
////        "changeVal":80
////    }),
////   ({
////        //buf编号
////        "bid":"1000000001",
////        "bufType":this.BUF_T["WU_GONG"],
////        "triggerOdds":100,
////        "resultType":1,//直接输出
////        //输出参考
////        "refTarget":this.RESULT_REFER_T["GONG_JI"],
////        //变化要求 1 增加 2 减少 3反弹
////        "changeType":1,
////        //变化类型 1百分比 2直接量
////        "changeValType":2,
////        //变量量
////        "changeVal":80
////    })
////]);
//
//var selfPartner(){
//
//
//    //队员数据结构
//    map tMember = ({
//        //头顶要显示的文字
//        "id":20002,
//        "tip":"",
//        "name":"张三丰",
//        "power":100,
//        "maxPower":100,
//        "qi":100,
//        "maxQi":100,
//        "levName":"金丹境",
//        //是否是队长
//        "leader":0,
//        //站位
//        "pos":0,
//        //区域标签
//        "area":"A",
//        //当前回合是否出手了?
//        "isAttack":0,
//        //是否死亡
//        "dead":0,
//        //攻击力
//        "attack":30,
//        //物防
//        "pdef":10,
//        //法防
//        "mdef":10,
//        //技能
//        "skills":({100001:getSkillData(100001)})
//    });
//    return ([tMember]);
//}
////生成野区的弱鸡NPC
//var randomGrNpc(var src){
//
//
//   map *resData = ([]);
//   for( int i; i<2; i++ ){
//       map tMember = ({
//            //头顶要显示的文字
//            "id":i,
//            "tip":"",
//            "name":randomCnName(),
//            "power":100,
//            "maxPower":100,
//            "qi":toInt(src.qi * 0.3),
//            "maxQi":toInt(src.maxQi * 0.3),
//            "levName":"真元境",
//            //是否是队长
//            "leader":0,
//            //站位
//            "pos":i,
//            //区域标签
//            "area":"B",
//            //当前回合是否出手了?
//            "isAttack":0,
//            //是否死亡
//            "dead":0,
//            //攻击力
//            "attack":12,
//            //物防
//            "pdef":10,
//            //法防
//            "mdef":10,
//            //技能
//            "skills":({100002:getSkillData(100002)})
//        });
//        resData+=tMember;
//   }
//
//
//    return resData;
//
//}
//
//void pk(var fa1,var fb1){
//
//
//   var userPartners = selfPartner();
//   //谁先出手
//   var *teams = ([
//        randomGrNpc(userPartners[0]),//对手的
//        userPartners// 自己的
//   ]);
//
//    var data =({});
//    data["partners"] = ({});
//    data["partners"]["A"] = ({});
//    data["partners"]["B"] = ({});
//    //对手数据
//    foreach( t in teams[0] ){
//       data["partners"]["B"][t.id]= ({
//               "id":t.id,
//               "name":t.name,
//               "power":t.power,
//               "maxPower":t.maxPower,
//               "qi":t.qi,
//               "maxQi":t.maxQi,
//               "levName":t.levName,
//               //站位
//               "pos":t.pos
//       });
//    }
//
//
//    //自己数据
//    foreach( t in teams[1] ){
//       data["partners"]["A"][t.id]= ({
//                     "id":t.id,
//                   "name":t.name,
//                   "power":t.power,
//                   "maxPower":t.maxPower,
//                   "qi":t.qi,
//                   "maxQi":t.maxQi,
//                   "levName":t.levName,
//                   //站位
//                   "pos":t.pos
//                });
//    }
//
//    data["skills"] =({
//        100001:"七彩吞天火-地",
//        100002:"七彩吞天火-天"
//    });
//
//
//  //战斗开始之前要发送的数据
//    var dataInfos = ({
//        "currDBase":data
//    });
//    println(toJsonStr(dataInfos));
//
//
//   int
//   //回合编号
//   roundNum=1,
//   ridx=1;
//
//   bool isEnd = false;
//     //回合的上下文信息
//   map context=({
//        //是否结束战斗了
//        "isEnd":false,
//        //回合编号
//        "roundNum":1,
//        //一个回合中，所有伙伴的出招数量
//        "allAttacks":0,
//        //战斗报文
//        "report":({
//            "courseBattle":([])
//        })
//   });
//
//   for(; !context.isEnd ; ){
//      if(  teams.size() < 2 ) {
//        println("没有团队数组呀!");
//        return 0;
//      }
//
//      println("当前第<"+context.roundNum+">回合");
//      var killers = teams[ridx];
//      //变换队伍
//      ridx = ridx == 0 ? 1 : 0;
//      var victims = teams[ridx];
//      startRound(context, killers, victims);
//   }
//
//   //战斗完成，构造战报数据
//    //赢还是输 0 输 1赢
//   int win=0;
//   if( findLives(teams[0]).size()<=0 ){
//       win=1;
//       println("你赢了奥!");
//   }
//
//    dataInfos = ({
//        "roundData":({
//             // 回合数
//            "roundTotal":context.roundNum,
//            //在roundTotal个回合中，所有伙伴出手了多少次
//            "allAttacks":context.allAttacks,
//            //赢还是输 0 输 1赢
//            "win":win
//        })
//
//    });
//
//
//
//    println(toJsonStr(dataInfos));
//
//   //回合总数
//    var reports = ({
//        "courseBattle":context.report["courseBattle"]
//    });
//
//    println(toJsonStr(reports));
//
//
//}
//
//void resetAttackStats(var teams ){
//    for(int i;i<teams.size();i++){
//        teams[i].isAttack = 0;
//    }
//}
//
//
//int checkDead(map context,map *killers, map *victims){
//    var c3,c4;
//    c3 = findLives(killers);
//    c4 = findLives(victims);
//    //没有活着的啦... 就结束
//    if( c3.size() <=0 || c4.size() <=0 ){
//         context.isEnd = true;
//         return 1;
//    }
//    return 0;
//}
//
////队伍vs队伍 killers如何选择谁先出手
//void startRound(map context,map *killers, map *victims){
//
//    var c1, c2, c3, c4;
////     varDump(killers,victims);
//    //出手状态初始化
//    resetAttackStats(killers);
//    resetAttackStats(victims);
//
//
//    //发起攻击
//    int count=1;
//    for(int i=0; i < 6; i++){//默认两边出手6次
//
//        c3 = findLives(killers);
//        c4 = findLives(victims);
//        //没有活着的啦... 就结束
//        if(checkDead(context,killers,victims)){
//
//            break;
//        }
//
//          c1 = findNeverAttack(killers);
//          c2 = findNeverAttack(victims);
//         //在这个回合...两边所有人都出手了
//         if( c1.size()<=0 && c2.size()<=0 ) {
//             break;
//         }
//        var killer ;
//        if( c1.size()  > 0 ){
//            //根据位置找出杀手,还需要判断两方同位的速度，谁高，谁先出手
//            killer = findKillerOfPos(i,killers);
//            if( !killer ) break;
//            //找出受害者 （受害者可能是己方，比如加血，同时也可能是多个）
//            //判断杀手的类型，确定是加血还是伤血,如果是加血，受害者(抽象名词)就是己方队友,不能用这个逻辑，加血就是加血，
//            //循环中 阵营 不可变
//
//            attack(context, ([killer]), victims);
//        }
//
//        if(checkDead(context,killers,victims)){
//            break;
//        }
//
//
//        if( c2.size()  > 0 ){
//            //受害方出手
//            killer = findKillerOfPos(i, victims);
//            if( !killer ) break;
//
//            attack(context, ([killer]), killers);
//        }
//    }
//    //回合增加
//    context.roundNum+=1;
//
//}
////找出队伍中活着的
//var findLives(map *teams){
//    var lives = ([]);
//    for( int i; i < teams.size(); i++ ){
//        if( teams[i].dead==0){
//            lives += teams[i];
//        }
//    }
//    return lives;
//}
//
////找出队伍中没有出手的
//var findNeverAttack(map *teams){
//    var never = ([]);
//    for( int i; i < teams.size(); i++ ){
//        if( teams[i].dead==0 && teams[i].isAttack==0){
//            never += teams[i];
//        }
//    }
//    return never;
//}
//
//
////根据占位选出杀手 既然是根据位置，那么返回值不能重复
////一个位子不可能两个角色,如果有，那就是出BUG啦
//var findKillerOfPos(int pos, map *teams){
//    //注意某个位置可能不存在战斗人
//    for( int i; i < teams.size(); i++ ){
//        if( teams[i].pos == pos && teams[i].dead==0){
//            return teams[i];
//        }
//    }
//    var res = ([]);
//    foreach(k in teams){
//       if( k.dead == 0 ){
//           res+=k;
//       }
//    }
//
//    if( res.size()<=0 ){//人都挂完了...
//        return 0;
//    }
//
//    if( sizeof(res) > 1 ){
//        println("findKillerOfPos 位置出现错误!");
//        return 0;
//    }
//
//    return res[0];
//
//}
//
//
////随机挑选一位角色
//
//
//void attack(map context,map *killers, map *victims){
//
//     map killer = killers[0];
//     int attack,damage,pdef,mdef;
//     var nVictimes = findLives(victims);
//     map victim = nVictimes[ random(0,nVictimes.size()) ];
//     var currSkill = selectSkill(killer);
//
//      //标识已出手
//     killer.isAttack = 1;
//
//     //skills是MAP
//     var sKey = keys(killer.skills);
//     //buf是数组
//     var bufs = killer.skills[sKey[0]]["buf"];
//     //取出buf
//
//      //下面两个条件其中一个成立了，但没进入...
////      varDump(1111111);  // ! 符号 和  ||  符号 存在优先级问题
//     if( !arrayp(bufs)  || sizeof(bufs)<=0 ){
//        println("杀手技能buf有问题!"+toJsonStr(killer.skills[sKey[0]]));
//        return;
//     }
//
//     context.allAttacks+=1;
//     var currBuf  = bufs[random(0,sizeof(bufs))];
////     println(toJsonStr(currBuf));
//     //要打谁?
//
//       // {"result_type":"直接输出","find_domain":"敌方所有","ref_change_type":"NONE","ref_change_val_type":0,"buf_name":"飞云","cycle_type":3,"find_num_max":1,"cost_num":0.02,"buf_id":300003,"cost_attr":"能量","ord":1,"buf_gid":200002,"cost_type":2,"trigger_odds":100,"find_exp":"","buf_type":"法术攻击","find_prop":"","ref_target":"攻击","ref_change_val":0,"find_num_min":0,"cycle":1,"B":"","A":""}
//     var kBufName = currBuf.buf_name;
//     var currAttack;
//     if( currBuf.ref_target == "攻击" ){
//        currAttack = killer.attack;
//     }
//
//     if( currBuf.result_type=="机率变化" ){
//        if( currBuf.ref_change_type=="增加" ){
//            currAttack = currAttack + currAttack * currBuf.ref_change_val;
//        }else if(currBuf.ref_change_type=="减少"){
//            currAttack = currAttack - currAttack * currBuf.ref_change_val;
//        }
//     }
//
//
//
//     //伤害 = 攻击-防御
//     attack = toInt(currAttack);//killer.attack;
//
//     pdef   = victim.pdef;
//     damage = attack - pdef;
//     victim.qi  = victim.qi - damage;
//
////      varDump(victim);
//     //检查是否还活着
//     if( victim.qi<=0 ){
//        victim.dead=1;
//     }
//     //killer可能会被反伤,所以也要检查
//
//     if( killer.qi<=0 ){
//        killer.dead = 1;
//     }
//
//
//     context.report["courseBattle"]+=({
//
//                      "killer":({
//                            //伙伴ID
//                             "id":killer.id,
//                             //血量
//                             "qi":killer.qi,
//                             //最大血量
//                             "maxQi":killer.maxQi,
//                             //能量
//                             "power":killer.power,
//                             //最大能量
//                             "maxPower":killer.maxPower,
//
//                             //战位
//                             "pos":killer.pos,
//                             //位置标签 A 左边 ,B右边
//                             "area":killer.area,
//                             //使用的技能ID
//                             "skillId":currSkill.sid,
//                             //是否死亡0 活着 1死亡
//                             "dead":killer.dead,
//                             //攻击力
//                             "attack":attack
//                      }),
//                      //可能是多个,但伤害的情况可能不同，这里先写死
//                      "vis":([
//                                ({
//                                  "id":victim.id,
//                                   "qi":victim.qi,
//                                   "maxQi":victim.maxQi,
//                                   "power":victim.power,
//                                   "maxPower":victim.maxPower,
//                                   //0 减少 1 增加 3 不变
//                                   "qiVt":damage == 0 ? 3 : damage > 0 ? 0 : 0,
//                                   "powerVt":3,
//
//                                   "pos":victim.pos,
//                                    //位置标签 A 左边 ,B右边
//                                   "area":victim.area,
//                                   "dead":victim.dead,
//                                   //气血收到的伤害 是加上去的还是减的 看qiVt
//                                   "qiChange":damage,
//                                   //能量受到的伤害 是加上去的还是减的 powerVt
//                                   "powerChange":0
//                                })
//                      ])
//
//     });
//
//
//     println( fmt("(%s)%s(%d) 使出 %s 对 (%s)%s(%d) 发起了攻击! %s 受到 %d 伤害。",
//                        killer.area,
//                        killer.name,
//                         killer.qi,
//                        currSkill.skill_name+"-"+kBufName,
//                        victim.area,
//                        victim.name,
//                        victim.qi,
//                        victim.name,
//                        damage));
////        println( fmt("------------(%s)%s(%d) - (%s)%s(%d)------------",
////                            killer.area,
////                            killer.name,
////                            killer.qi,
////
////                            victim.area,
////                            victim.name,
////                            victim.qi
////
////                            ));
//}
//
//
//
//
////读配置文件
//void loadExcelData(){
//     this.skills         = readExcelSkills();
//     this.bufs           = readExcelBuffers();
//     this.skillRefBuf    = readSkillRefBuf();
//}
//
//
//void main(string* args)  {
//
//
//     map sk =  getSkillData(100001);
//     pk(1,2);
////     println(toJsonStr(sk));
//}
//
//
//void heartbeat(){
//    pk(1,2);
//}
//
//
//
////角色的技能处理======================
//void selectSkill(map killer){
//    //随机选一个Id
//    int *skIds = keys(killer.skills);
//    return killer.skills[skIds[random( 0, skIds.size() )]];
//}
//
//
//
//
//
//
//
//map getSkillData(int skillId){
//
//
//    map *skills         = this.skills;
//    map *bufs           = this.bufs;
//    map *skillRefBuf    = this.skillRefBuf;
////    int skillId = 100001;
//    map skillData = ({});
//    //找出skill数据
//    for(int i; i < skills.size();i++){
//        if( skills[i]["sid"]==skillId ){
//            skillData = skills[i];
//            break;
//        }
//    }
//    //找出Buf数据
//    int *bufIds = ([]);
//    //关联数据
//    for(int i; i < skillRefBuf.size();i++){
//        if( skillRefBuf[i]["sid"]==skillId ){
//            bufIds+=skillRefBuf[i]["buf_gid"];
//            break;
//        }
//    }
//
//    //找buf
//    map *bufDatas = ([]);
//
//    for(int i; i < bufIds.size(); i++){
//        for( int j; j < bufs.size();j++){
//             if( intp(bufs[j]["buf_gid"]) && bufs[j]["buf_gid"] == bufIds[i] ){
//                bufDatas+=bufs[j];
//                continue;
//             }
//        }
//    }
//
//    //skillData["buf"] is array
//    skillData["buf"] = bufDatas;
////    varDump(skillData);
//    return skillData;
//}
//
//map* readExcelSkills(){
//        var xlsData = readExcel("","J技能表",1,0);
//        map keyData = ({});
//        map *resData = ([]);
//        int i=0;
//        foreach(d in xlsData){
//           if(i==0){
//             for(int j; j < d.size() ; j++){
//                 if( d[j]=="" ) continue;
//                 keyData[j] = d[j];
//             }
//           }else{
//
//            var resUnitData = ({});
//            string *headerNames = values(keyData);
//             foreach( hn in headerNames){
//                resUnitData[hn]="";
//             }
//             for(int j; j < d.size() ; j++){
//                 if(nonep(d[j])) continue;
//                 if( nonep(keyData[j]) ) continue;
//                   resUnitData[keyData[j]] = d[j];
//             }
//             resData+=resUnitData;
//           }
//           i++;
//        }
//
//       return resData;
//}
//
//
//map* readExcelBuffers(){
//
//        var xlsData = readExcel("","J技能BUF表",6,0);
//        map keyData = ({});
//        map *resData = ([]);
//
//        int i=0;
//        foreach(d in xlsData){
//           if(i==0){
//             for(int j; j < d.size() ; j++){
//                 if( !d[j] ) continue;
//                 keyData[j] = d[j];
//             }
//             //在此处构造好结构，等之后的数据填充
//
//           }else{
//             var resUnitData = ({});
//             string *headerNames = values(keyData);
//             foreach( hn in headerNames){
//                resUnitData[hn]="";
//             }
//             for(int j; j < d.size() ; j++){
//                 if(nonep(d[j])) continue;
//                 if( nonep(keyData[j]) ) continue;
//                 resUnitData[keyData[j]] = d[j];
//             }
//             resData+=resUnitData;
//           }
//           i++;
//        }
//        return resData;
//}
//
//
//
////技能和buf关联数据
//map* readSkillRefBuf(){
//
//        var xlsData = readExcel("","J技能和BUF关联表",4,0);
//        map keyData = ({});
//        map *resData = ([]);
//
//        int i=0;
//        foreach(d in xlsData){
//           if(i==0){
//             for(int j; j < d.size() ; j++){
//                 if( !d[j] ) continue;
//                 keyData[j] = d[j];
//             }
//             //在此处构造好结构，等之后的数据填充
//
//           }else{
//             var resUnitData = ({});
//             string *headerNames = values(keyData);
//             foreach( hn in headerNames){
//                resUnitData[hn]="";
//             }
//             for(int j; j < d.size() ; j++){
//                 if(nonep(d[j])) continue;
//                 if( nonep(keyData[j]) ) continue;
//                 resUnitData[keyData[j]] = d[j];
//             }
//             resData+=resUnitData;
//           }
//           i++;
//        }
//       return resData;
//}
